package abel.wlmr.model.unit;

import java.time.DateTimeException;

import abel.util.StdBcdNumber;
import abel.wlmr.model.WlmrBaseUnit;
import abel.wlmr.model.WlmrException;
import io.netty.buffer.ByteBuf;

/**
 * B.5.11.2.4.71 F410：水表月冻结正向累积流量示值
 * 数据单元格式见表 B.171。
 * 表B.171 月冻结正向累积流量示值数据单元格式
 * 数据内容 数据格式 单位 字节数
 * 月冻结类数据时标 Td_m 见本附录 B.5.13.1.3.5 月年 2
 * 
 * 终端抄表时间 见附录 C.15 分时日月年 5
 * 正向总流量示值 见附录 C.29 单位代号 5
 * 
 * 月年 见附录 C.21 2
 * 
 * @author Abel
 *
 */
public class AfnSecondF410DownUnit extends WlmrBaseUnit {
    private static final short FIXED_LENGTH = 2;

    /**
     * 月冻结类数据时标 Td_m 见本附录 B.5.13.1.3.5 月年 2
     * 月年 见附录 C.21 2
     */
    private StdBcdNumber frozeTdm;

    public AfnSecondF410DownUnit() {
        super();
    }

    public AfnSecondF410DownUnit(short guessedLen) {
        super(guessedLen);
    }

    /* (non-Javadoc)
     * @see abel.wlmr.model.AppUnitBody#appendBuf(io.netty.buffer.ByteBuf)
     */
    @Override
    public ByteBuf appendBuf(ByteBuf buf) {
        if (frozeTdm == null || frozeTdm.length() != 2) {
            throw new IllegalArgumentException("froze tdm should be 2 bcd long");
        }

        buf.writeBytes(frozeTdm.toBytes());

        return buf;
    }

    /* (non-Javadoc)
     * @see abel.wlmr.model.AppUnitBody#parseBuf(io.netty.buffer.ByteBuf)
     */
    @Override
    public int parseBuf(ByteBuf buf) throws WlmrException {
        if (checkBuffer(buf) < 0) {
            return -1;
        }

        frozeTdm = new StdBcdNumber();
        frozeTdm.populateBytes(buf, 2);

        try {
            frozeTdm.toMeterC21Joda();
        } catch (DateTimeException e) {
            throw new WlmrException("invalid froze-tdd in C.21", e);
        }

        return FIXED_LENGTH;
    }

    /* (non-Javadoc)
     * @see abel.wlmr.model.WlmrDataPart#getMinLength()
     */
    @Override
    public int getMinLength() {
        return FIXED_LENGTH;
    }

    /* (non-Javadoc)
     * @see abel.wlmr.model.AppUnitBody#getFinalLen()
     */
    @Override
    public short getFinalLen() {
        return FIXED_LENGTH;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return String.format("{frozeTdm:%s}", frozeTdm);
    }

    /**
     * 月冻结类数据时标 Td_m 见本附录 B.5.13.1.3.5 月年 2
     * 月年 见附录 C.21 2
     * 
     * @return the frozeTdm
     */
    public StdBcdNumber getFrozeTdm() {
        return frozeTdm;
    }

    /**
     * 月冻结类数据时标 Td_m 见本附录 B.5.13.1.3.5 月年 2
     * 月年 见附录 C.21 2
     * 
     * @param frozeTdm
     *            the frozeTdm to set
     */
    public void setFrozeTdm(StdBcdNumber frozeTdm) {
        if (frozeTdm == null || frozeTdm.length() != 2) {
            throw new IllegalArgumentException("froze tdm should be 2 bcd long");
        }

        // may throw IAE
        frozeTdm.toMeterC21Joda();

        this.frozeTdm = frozeTdm;
    }
}
